/* 
Promise.all是类上的方法，类上的方法是静态方法，可以实现等待所有的异步执行完以后，拿到统一的结果;
解决异步并发，同步处理结果；
*/

const Promise = require("./then");

let fs = require("fs");

function read(url){
    let dfd = Promise.defer();

    fs.readFile(url,'utf8',function(err, data){
        if(err) dfd.reject(err);
        dfd.resolve(data);
    });

    return dfd.promise;
}

read('./txt/a.txt').then(res => {
    console.log(res);
},err => {
    console.log(err);
});

function isPromise(x){
    if(typeof x === "object" && x!==null || typeof x === "function"){
        if(typeof x.then === "function"){
            return true;
        }
    }else{
        return false;
    }
}

Promise.all = function(values){
    return new Promise((resolve,reject) => {
        let arr = [];
        let index =0;//解决多个异步并发的问题，要是用计数器

        function processData(key,val){
            arr[key] = val;
            if(++index == values.length){
                resolve(arr);
            }
        }

        for(let i=0;i<values.length;i++){
            let current = values[i];
            if(isPromise(values[i])){
                current.then(data => {
                    processData(i,data);
                },reject);
            }else{
                processData(i,current);
            }
        }
    })
}

//全部成功才成功，有任何一个失败就失败了
Promise.all([1,2,3,read('./txt/a.txt'),5,6]).then(data => {
    console.log(data);
},err => {
    console.log(err);
})